package com.fypg.module.blooddonation.api.service.bloodDonation;

import com.fypg.framework.common.exception.ServiceException;
import com.fypg.module.blooddonation.api.client.dal.bloodStation.DictionaryItem;
import com.fypg.module.blooddonation.api.controller.app.bloodDonation.vo.*;
import com.fypg.module.blooddonation.api.dto.wanda.GetDecryptInfoInput;
import com.fypg.module.blooddonation.api.dto.wanda.GetDecryptInfoOutput;

import java.util.List;

/**
 * 献血服务接口
 * 提供献血相关的业务功能，包括字典查询、排班查询、详情查询、记录查询和预约功能
 *
 * @author 盘古
 */
public interface BloodDonationService {

    GetDecryptInfoOutput getDecryptInfo(GetDecryptInfoInput inputModel);

    /**
     * 获取字典类型列表
     * 用于查询业务字典数据，如民族、户籍、职业、婚姻状况、文化程度等
     *
     * @param inputModel 字典查询请求参数
     * @return 字典项列表，包含字典编码和名称
     * @throws ServiceException 当字典查询失败时抛出业务异常
     */
    List<DictionaryItem> getDictionaryTypeList(DictionaryReqVO inputModel);

    /**
     * 获取献血排班列表
     * 查询指定日期和献血类型的可用排班信息，包括地点、时间段和可预约人数
     *
     * @param inputModel 排班查询请求参数，包含献血日期和类型
     * @return 排班列表响应，按地点分组显示时间段信息
     * @throws ServiceException 当排班查询失败或参数无效时抛出业务异常
     */
    List<GetBloodDonationScheduleListRespVO> getBloodDonationScheduleList(GetBloodDonationScheduleListReqVO inputModel);

    /**
     * 获取献血详情
     * 查询用户的献血预约详情信息，包括个人基本信息、预约信息和献血核查结果
     *
     * @param inputModel 详情查询请求参数，包含医疗卡信息和血站编码
     * @return 献血详情响应，包含完整的预约信息和核查状态
     * @throws ServiceException 当详情查询失败、无记录或核查不通过时抛出业务异常
     */
    GetBloodDonationDetailRespVO getBloodDonationDetail(GetBloodDonationDetailReqVO inputModel);

    /**
     * 获取献血记录信息
     * 查询用户的历史献血记录，包括血型信息、献血次数、总量和历次献血详情
     *
     * @param inputModel 记录查询请求参数，包含医疗卡信息
     * @return 献血记录响应，包含汇总信息和详细记录列表
     * @throws ServiceException 当记录查询失败或无献血记录时抛出业务异常
     */
    GetBloodDonationRecordInfoRespVO getBloodDonationRecordInfo(GetBloodDonationRecordInfoReqVO inputModel);

    /**
     * 新增献血预约
     * 创建新的献血预约记录，包含完整的预约信息和个人信息
     * 在预约前会进行多重校验：时间有效性、是否已献血、是否符合献血条件等
     *
     * @param inputModel 预约请求参数，包含完整的预约信息
     * @return 预约响应，包含预约结果信息
     * @throws ServiceException 当预约失败、参数无效或不符合献血条件时抛出业务异常
     */
    AddBloodDonationOrderRespVO addBloodDonationOrder(AddBloodDonationOrderReqVO inputModel);
}
